package com.wuwei.elearning.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.wuwei.elearning.question.domain.Subject;
import lombok.Data;
import org.springframework.beans.BeanUtils;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用于给级联选择器显示的vo
 * 适配elementui和vantui
 */
@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class SubjectVo extends Subject {
    private String label;//name
    private Long value;//主键id
    private String text;//name

    private List<SubjectVo> children;
    private boolean canService;

    public SubjectVo() {
    }

    public SubjectVo(String label, Long value, String text, Short canService, LocalDate endTime) {
        super(endTime);
        this.label = label;
        this.value = value;
        this.text = text;
        if (canService==null||canService == 0) {
            this.canService =false;
        } else {
            this.canService = true;
        }
        this.children = new ArrayList<>();
    }


    public static List<SubjectVo> convertToTree(List<Subject> subjects) {
        // 创建一个Map来存储所有节点，key为id
        Map<Long, SubjectVo> nodeMap = new HashMap<>();
        List<SubjectVo> rootNodes = new ArrayList<>();

        // 第一步：创建所有节点
        for (Subject subject : subjects) {
            SubjectVo node = new SubjectVo(subject.getName(),subject.getId(),subject.getName(), subject.getOnService(),subject.getEndTime());
            nodeMap.put(subject.getId(), node);
        }

        // 第二步：构建树形结构
        for (Subject subject : subjects) {
            SubjectVo currentNode = nodeMap.get(subject.getId());

            if (subject.getParentId() == null) {
                // 如果是根节点，加入根节点列表
                rootNodes.add(currentNode);
            } else {
                // 如果有父节点，将当前节点加入到父节点的children中
                SubjectVo parentNode = nodeMap.get(subject.getParentId());
                if (parentNode != null) {
                    parentNode.getChildren().add(currentNode);
                }
            }
        }

        // 第三步：对于没有子节点的节点，删除children属性（而不是设置为null）
        for (SubjectVo node : nodeMap.values()) {
            if (node.getChildren().isEmpty()) {
                // 不再设置null，而是保持空列表状态，或者可以通过反射完全移除该属性
                // node.setChildren(null);
            }
        }

        return rootNodes;
    }

    /**
     * 将树形结构转换为扁平化列表
     * @param root 根节点
     * @return 包含parentId的扁平化列表
     */
    public static List<SubjectVo> flattenTree(SubjectVo root) {
        List<SubjectVo> result = new ArrayList<>();
        flatten(root, result, null); // 根节点的parentId默认为0
        return result;
    }

    private static void flatten(SubjectVo node, List<SubjectVo> result, Long parentId) {
        if (node == null) return;

        // 设置当前节点的parentId并加入结果集
        node.setParentId(parentId);
        result.add(node);

        // 递归处理子节点，传递当前节点ID作为子节点的parentId
        if (node.getChildren() != null) {
            for (SubjectVo child : node.getChildren()) {
                flatten(child, result, node.getValue());
            }
        }
    }

}
